-- Programa principal.
-- Permite cargarle un archivo con con el codigo e imprime el ast en pantalla.
-- modo de utilizacion:
--      Main <nombre de archivo>
--
-- modo de compilacion del modulo main:
--      ghc --make Main
--

module Main
    where

import IO
import System.Environment (getArgs)
import ExprDataTypes
import ExprTokens
import ExprSyntax
import VerifSemantica
import ExprAM
import ExprCIL
import OptFuente
import Extras

printLex y = print (exprLex y)
printAst y = print (exprSint (exprLex y))
codigoVSem y
    | asd == [] = ast
    | otherwise = asd
  where 
    ast = exprSint (exprLex y)
    asd = vSem2 ast 

generacionDeCodigo a nom  =  strDo nom vM instrucciones lastType
    where 
        (vM, instrucciones) =  (passCod optimumCode)
        lastType = snd (last optimumCode)
        optimumCode = (optFuente a)


--  joinLines inFile = 
--  do ineof <- hIsEof inFile)
--      if ineof then re)urn ()
--          else do x <- hGetLine inFile
--                  return x ++ joinLines inFile

split :: String -> [String]
split [] = []
split ('.':t) = split t
split s = takeWhile ('.' /=) s : split (dropWhile ('.' /=) s)

nombreArchivo nom = (head(split nom)) ++ ".il"

generateOutput input = do
    x <- openFile input ReadMode
    y <- hGetLine x
    print (codigoVSem y)
    writeFile nom (generacionDeCodigo (codigoVSem y) (head(split nom)))
    where nom = nombreArchivo input

main = do 
    args <- getArgs
    case args of
        [inputFile] -> generateOutput inputFile
        _ -> putStrLn "Error: no ha ingresado el nombre del archivo de entrada"
